/*
 * diskfree.c
 *
 *  Created on: Jun 5, 2011
 *      Author: sainw
 */

#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "server.h"

/* HTML source for the start of the page we generate.*/
static char* page_start = "<html>\n"
	" <body>\n"
	" <pre>\n";
/* HTML source for the end of the page we generate.
 */
static char* page_end = " </pre>\n"
	" </body>\n"
	"</html>\n";
void module_generate(int fd) {
	pid_t child_pid;
	int rval;
	/* Write the start of the page. */
	write(fd, page_start, strlen(page_start));
	/* Fork a child process. */
	child_pid = fork();
	if (child_pid == 0) {
		/* This is the child process. */
		/* Set up an argument list for the invocation of df.*/
		char* argv[] = { "/bin/df", "-h", NULL };

		/* Duplicate stdout and stderr to send data to the client socket.*/
		rval = dup2(fd, STDOUT_FILENO);
		if (rval == -1)
			system_error("dup2");
		rval = dup2(fd, STDERR_FILENO);
		if (rval == -1)
			system_error("dup2");
		/* Run df to show the free space on mounted file systems. */
		execv(argv[0], argv);
		/* A call to execv does not return unless an error occurred. */
		system_error("execv");
	} else if (child_pid > 0) {
		/* This is the parent process. Wait for the child process to
		 finish. */
		rval = waitpid(child_pid, NULL, 0);
		if (rval == -1)
			system_error("waitpid");
	} else
		/* The call to fork failed. */
		system_error("fork");
	/* Write the end of the page. */
	write(fd, page_end, strlen(page_end));
}
